package 简单.其他;

import java.util.HashMap;
import java.util.Map;

/**
 * 在一个小镇里，按从 1 到 n 为 n 个人进行编号。传言称，这些人中
 * 有一个是小镇上的秘密法官。
 * <p>
 * 如果小镇的法官真的存在，那么：
 * <p>
 * 小镇的法官不相信任何人。
 * 每个人（除了小镇法官外）都信任小镇的法官。
 * 只有一个人同时满足条件 1 和条件 2 。
 * 给定数组 trust，该数组由信任对 trust[i] = [a, b] 组成，表示编
 * 号为 a 的人信任编号为 b 的人。
 * <p>
 * 如果小镇存在秘密法官并且可以确定他的身份，请返回该法官的编号。
 * 否则，返回 -1。
 * <p>
 *  
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/find-the-town-judge
 */
public class 找到小镇的法官_997 {

    public static void main(String[] args) {

        int[][] ints = {{1, 8}, {1, 3}, {2, 8}, {2, 3}, {4, 8}, {4, 3}, {5, 8}, {5, 3}, {6, 8}, {6, 3}, {7, 8}, {7, 3}, {9, 8}, {9, 3}, {11, 8}, {11, 3}};
        System.out.println(findJudge(11, ints));

    }

    /**
     * 使用哈希表
     *
     * @param n
     * @param trust
     * @return
     */
    public static int findJudge(int n, int[][] trust) {
        if (trust.length == 0) {
            if (n == 1) {
                return 1;
            } else {
                return -1;
            }
        }
        Map<Integer, Integer> believeCount = new HashMap<>();  //相信过别人的人
        Map<Integer, Integer> believedCount = new HashMap<>();  //人们被相信的次数
        for (int[] ints : trust) {
            believeCount.put(ints[0], 1);
            believedCount.put(ints[1], believedCount.getOrDefault(ints[1], 0) + 1);
        }
        for (int i = 1; i <= n; i++) {
            if (believeCount.get(i) == null) {  //不相信任何人的人是否被其他所有人相信
                if (believedCount.containsKey(i) && believedCount.get(i) == n - 1) {
                    return i;
                }
            }
        }
        return -1;
    }

    //TODO  有向图中节点的入度和出度

}
